#!/usr/bin/env python3
import argparse
import sys
from symtable import Class
from scanner.core import Scanner
from scanner.utils.validator import validate_args
from scanner.utils.logger import setup_logger
import pyfiglet  # 导入字体库
from colorama import Fore  # 导入颜色库

# 命令行参数  使用argparse库
def parse_arguments():
    parser = argparse.ArgumentParser()
   #  argparse.ArgumentParser  用于创建一个解析器对象
    parser.add_argument('-t', '--target', required=True, # required=True表示必须输入
                      help='扫描目标 (IP, IP范围,CIDR)') #IP range 例如：192.168.1.1-192.168.1.254
    parser.add_argument('-p', '--ports',
                      help='要扫描的端口(单个端口、端口列表或端口范围)。如果未指定，将扫描常用端口')
    parser.add_argument('--threads', type=int, default=10,
                      help='并发线程数 (默认值: 10)')
    parser.add_argument('--timeout', type=int, default=2,
                      help='超时时间(秒) (默认值: 2)')
    parser.add_argument('--output', default='all',
                      choices=['txt', 'html', 'json', 'all'],
                      help='报告输出格式 (默认值: all)')
    parser.add_argument('--scan-type', default='syn',
                      choices=['syn', 'tcp', 'udp'],
                      help='扫描类型 (默认值: syn)')
    parser.add_argument('--udp-retries', type=int, default=3,
                      help='UDP扫描重试次数 (默认值: 3)')
    parser.add_argument('--no-ping', action='store_true',
                      help='跳过主机发现')

    return parser.parse_args()

# 打印横幅
def banner():
    test = pyfiglet.figlet_format("Port Scan", font="ansi_regular")
    print(Fore.BLUE + test)
    print(
        Fore.BLUE + f"端口扫描工具 {version}   作者:张有泽"
    )

version = "2.2.1"  # 版本号
def main():
    logger = setup_logger()    # 初始化日志

    banner()  # 打印横幅
    
    try:
        args = parse_arguments() # 获取命令行参数
        validate_args(args)  # 验证参数
        scanner = Scanner(args) # 创建扫描器对象
        scanner.start() # 开始扫描
        
    except KeyboardInterrupt:
        logger.info("\n用户中断扫描")  # 按Ctrl+C
        sys.exit(1)  # 退出程序,返回状态码1
    except Exception as e:
        logger.error(f"发生错误: {str(e)}")  # 记录错误信息
        sys.exit(1)  # 发生异常时退出程序,返回状态码1

if __name__ == "__main__":
    main()



